package ZengJiHong2.Test1A;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/**
 * @ClassName test1a
 * @Author 16799
 * @Date 2025/8/19 17:04
 * @Version 1.0
 * @Description TODO
 *
 *  时间：2025年8月19日17:04:45
 *      这次不定义对象，直接写
 *
 *      疑问：用ArrayList,每次删除奇数位之后生成的新的集合，新集合里面元素的位置又是无序的啊，不影响吗，会影响
 *          可是为什么前面ArrayList集合存储对象类型的数据，每一次的顺序都没有变化，就不会变成无序的呢？
 *
 **/
public class test1a {
    public static void main(String[] args) {
        //先创建100个不重复的数字存入列表，模拟100个编号不同的囚犯
        List<Integer> people = new ArrayList<>();
        Random r = new Random();
        for (int i = 0; i < 100; i++) {
            int code = r.nextInt(200)+1;
            if (people.contains(code)){
                //重新进行这次循环，生成另一个随机数作为编号
                i--;
            }else {
                people.add(code);
            }
        }
        System.out.println("集合大小为： "+people.size()+people);

        //后面这个people集合变了，所以需要备份一下
        List<Integer> tempPeople = new ArrayList<>();
        //tempPeople = people;  放在这里效果一样
        tempPeople.addAll(people);

/*
    有错：为什么我的输出位：该编号的初始位置为： 65，不是64，哪里出问题了
    问题在这里：for (int i = people.size()-1; i >= 0; i-=2)   people = tempList;
写成这样的时候，遍历结果是第1次遍历后临时集合的大小：50   第2次遍历后临时集合的大小：25   第3次遍历后临时集合的大小：13    第4次遍历后临时集合的大小：7
        集合刚开始是100个，为偶数个，那么偶数个的最后一个当然是偶数位，不需要删除。
        但是后面新的集合不是偶数个，假如[1,2,3,4,5]，people.size()-1索引为4在元素5这里，并没有被删除而是添加到新的集合中去了，就会出错了
    改正：集合个数为偶数个或者奇数个的时候，从后往前删时，倒数第一个是需要判断是否删除的

*/
         /*
        还是有问题，因为每次people = tempList;都建立了新的ArrayList集合，里面的元素都又会被打乱顺序
         */
        //删除奇数位，[1,2,3,4,5,6]   也就是删除索引为偶数位的，列表考虑从后往前删
        //索引：      0,1,2,3,4,5
        //也就是留下偶数位索引，用一个临时集合存储
/*        int a = 0;
        while (people.size()>1) {
            a++;
            List<Integer> tempList = new ArrayList<>();
           *//* for (int i = people.size()-1; i >= 0; i-=2) {
                   int data = people.get(i);
                   tempList.add(data);
            }*//*
            //改正：
            for (int i = people.size()%2==0 ? people.size()-1 : people.size()-2; i >=0 ; i-=2) {
                tempList.add(people.get(i));
            }

            System.out.println("第"+a+"次遍历后临时集合的大小："+tempList.size()+",第"+a+"轮的删除情况: "+tempList);
            people = tempList;
        }
        int code = people.get(0);
        System.out.println("遍历到最后的结果编号: "+code);
        int index = tempPeople.indexOf(code);
        System.out.println("该编号的初始位置为： "+index);  */


        //上面的改正，所以就不要频繁生成新的ArrayList集合了，元素顺序会打乱，就在一个集合中删减奇数位
        //[1,2,3,4,5,6]     [1,2,3,4,5]
        int a = 0;
        while (people.size()>1) {
            a++;
            //注意，这次是删除奇数位的元素，所以要找奇数位。上面的想法是找偶数位的元素然后留下来继续遍历。两种方法完全不同
            for (int i = people.size()%2==0 ? people.size()-2 : people.size()-1 ; i >=0 ; i-=2) {
                people.remove(i);
            }
            System.out.println("第"+a+"次遍历后临时集合的大小："+people.size()+",第"+a+"轮的删除情况: "+people);

        }
        int code = people.get(0);
        System.out.println("遍历到最后的结果编号: "+code);
        int index = tempPeople.indexOf(code);
        System.out.println("该编号的初始位置为： "+(index+1));


    }
}
